/*
 * Copyright Notice ====================================================
 * This file contains proprietary information of JeeStrap Co.
 * Copying or reproduction without prior written approval is prohibited.
 * Copyright (c) 2014 All rights reserved. =============================
 */

package com.jeestrap.common.smartcoder.generator.javafile;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import com.jeestrap.common.smartcoder.domain.CodeDesc;
import com.jeestrap.common.smartcoder.domain.OrmTableField;
import com.jeestrap.common.smartcoder.generator.CodeGenerator;

/**
 * Description goes here.
 * 
 * @since
 */
public class EntityGenerator extends CodeGenerator {

	private Map<String, String> excludeMap;
	
	public EntityGenerator(Map<String, Object> model) {
		super(model);
		excludeMap = new HashMap<String,String>();
		excludeMap.put("createBy", "创建者");
		excludeMap.put("createDate", "创建时间");
		excludeMap.put("updateBy", "更新者");
		excludeMap.put("updateDate", "更新时间");
		excludeMap.put("remarks", "备注信息");
		excludeMap.put("delFlag", "删除标记（0：正常；1：删除）");
	}

	// Bean Validation 中内置的 constraint
	//
	// @Null 被注释的元素必须为 null
	// @NotNull 被注释的元素必须不为 null
	// @AssertTrue 被注释的元素必须为 true
	// @AssertFalse 被注释的元素必须为 false
	// @Min(value) 被注释的元素必须是一个数字，其值必须大于等于指定的最小值
	// @Max(value) 被注释的元素必须是一个数字，其值必须小于等于指定的最大值
	// @DecimalMin(value) 被注释的元素必须是一个数字，其值必须大于等于指定的最小值
	// @DecimalMax(value) 被注释的元素必须是一个数字，其值必须小于等于指定的最大值
	// @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
	// @Digits (integer, fraction) 被注释的元素必须是一个数字，其值必须在可接受的范围内
	// @Past 被注释的元素必须是一个过去的日期
	// @Future 被注释的元素必须是一个将来的日期
	// @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
	//
	// Hibernate Validator 附加的 constraint
	// @NotBlank(message =) 验证字符串非null，且长度必须大于0
	// @Email 被注释的元素必须是电子邮箱地址
	// @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
	// @NotEmpty 被注释的字符串的必须非空
	// @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
	@Override
	public Map<String, Object> getVariableContext(CodeDesc codeDesc) {
		
		List<OrmTableField> ormTableFieldList = codeDesc.getOrmTableFieldList();
		List<OrmTableField> ormFieldList = new ArrayList<OrmTableField>();
		for( OrmTableField ormField : ormTableFieldList){
			if(!excludeMap.containsKey(ormField.getJavaFieldName())){
				ormFieldList.add(ormField);
			}
		}
		model.put("fields", ormFieldList);
		return model;
	}

	@Override
	public String getTemplate() {
		return "entity.ftl";
	}

}
